#include <iostream>
#include <random>
#include <sstream>
#include <iomanip>
#include <atomic>

// 生成8个0~255的随机数，取出一个8字节序号，组成16字节数据转为32个16进制字符
int main()
{
    std::random_device rd;
    //size_t num = rd();// 生成一个机器随机数，效率较低
    // 解决方法是将一个机器随机数作为种子
    std::mt19937_64 gernator(rd());// 通过梅森旋转算法生成伪随机数
    // 我们需要的是8个0~255的数字（8字节），因此要限定区间
    std::uniform_int_distribution<int> distribution(0,255);
    // 然后将生成的数字转为16进制数字字符(2个字符1字节)
    std::stringstream ss;
    for(int i = 0;i<8;i++)
    {
        ss << std::setw(2) << std::setfill('0') << std::hex << distribution(gernator);
        if(i == 3 || i == 5 || i == 7)
            ss << "-";
    }

    static std::atomic<size_t> seq(1);// 定义一个原子类型整数初始化为1
    size_t num = seq.fetch_add(1);// size_t刚好8字节
    for(int i = 7;i>=0;i--)
    {
        ss << std::setw(2) << std::setfill('0') << std::hex << ((num >> i*8) & 0xff);
        if(i == 6)
            ss << "-";
    }

    std::cout << ss.str() << std::endl;

    return 0;
}


        // std::string uuid()
        // {
        //     std::random_device rd;
        //     std::mt19937_64 gernator(rd());
        //     std::uniform_int_distribution<int> distribution(0,255);
        //     std::stringstream ss;
        //     for(int i = 0;i<8;i++)
        //     {
        //         ss << std::setw(2) << std::setfill('0') << std::hex << distribution(gernator);
        //         if(i == 3 || i == 5 || i == 7)
        //             ss << "-";
        //     }

        //     static std::atomic<size_t> seq(1);//注意static保证序号自增
        //     size_t num = seq.fetch_add(1);
        //     for(int i = 7;i>=0;i--)
        //     {
        //         ss << std::setw(2) << std::setfill('0') << std::hex << ((num >> i*8) & 0xff);
        //         if(i == 6)
        //             ss << "-";
        //     }
        //     return ss.str();
        // }

        // int main()
        // {
        //     for(int i = 0;i<10;i++)
        //     std::cout << uuid() << std::endl;
        //     return 0;
        // }